#include "motor_adc.h"
#include <string.h>

// 全局ADC通道数组
Motor_ADC_Type g_motor_adc_channels[MOTOR_ADC_CHANNEL_MAX]=
{
    {	//MOTOR_ADC_CHANNEL_A	A相电压, 用于计算电机A相电流
        .adc_handle = NULL,
        .adc_channel = 0,
        .conv_coef = 1.0f,
        .offset = 0,
        .is_valid = 0,
        .adc_raw_value = 0,
        .conv_value = 0.0
    },
    {	//MOTOR_ADC_CHANNEL_B	B相电压, 用于计算电机B相电流
        .adc_handle = NULL,
        .adc_channel = 0,
        .conv_coef = 1.0f,
        .offset = 0,
        .is_valid = 0,
        .adc_raw_value = 0,
        .conv_value = 0.0
    },
    {	//MOTOR_ADC_CHANNEL_C	C相电压, 用于计算电机C相电流
        .adc_handle = NULL,
        .adc_channel = 0,
        .conv_coef = 1.0f,
        .offset = 0,
        .is_valid = 0,
        .adc_raw_value = 0,
        .conv_value = 0.0
    },
    {	//MOTOR_ADC_CHANNEL_DC 供给电机的直流总电压, 用于计算电机耗电总电流
        .adc_handle = NULL,
        .adc_channel = 0,
        .conv_coef = 1.0f,
        .offset = 0,
        .is_valid = 0,
        .adc_raw_value = 0,
        .conv_value = 0.0
    },
    {	//MOTOR_ADC_CHANNEL_TEMP_DRV 电机驱动板温度
        .adc_handle = NULL,
        .adc_channel = 0,
        .conv_coef = 1.0f,
        .offset = 0,
        .is_valid = 0,
        .adc_raw_value = 0,
        .conv_value = 0.0
    },
    {	//MOTOR_ADC_CHANNEL_TEMP_A 电机A相PTC电压, 用于计算电机A相温度 
        .adc_handle = NULL,
        .adc_channel = 0,
        .conv_coef = 1.0f,
        .offset = 0,
        .is_valid = 0,
        .adc_raw_value = 0,
        .conv_value = 0.0
    },
    {	//MOTOR_ADC_CHANNEL_TEMP_B 电机B相PTC电压, 用于计算电机B相温度
        .adc_handle = NULL,
        .adc_channel = 0,
        .conv_coef = 1.0f,
        .offset = 0,
        .is_valid = 0,
        .adc_raw_value = 0,
        .conv_value = 0.0
    },
    {	//MOTOR_ADC_CHANNEL_TEMP_C 电机C相PTC电压, 用于计算电机C相温度
        .adc_handle = NULL,
        .adc_channel = 0,
        .conv_coef = 1.0f,
        .offset = 0,
        .is_valid = 0,
        .adc_raw_value = 0,
        .conv_value = 0.0
    }
};

void motor_adc_init(void)
{
    // ADC初始化已由STM32CubeMX完成
    // 这里可以添加额外的初始化代码
}

void motor_adc_set_channel(Motor_ADC_Channel_e channel, ADC_HandleTypeDef *adc_handle, uint16_t adc_channel, float conv_coef)
{
    // 检查通道有效性
    if (channel >= MOTOR_ADC_CHANNEL_MAX) {
        return;
    }
    
    // 设置通道参数
    g_motor_adc_channels[channel].adc_handle = adc_handle;
    g_motor_adc_channels[channel].adc_channel = adc_channel;
    g_motor_adc_channels[channel].conv_coef = conv_coef;
    g_motor_adc_channels[channel].is_valid = 1; // 标记为有效
}

void motor_adc_set_offset(Motor_ADC_Channel_e channel, uint16_t offset)
{
    // 检查通道有效性
    if (channel >= MOTOR_ADC_CHANNEL_MAX) {
        return;
    }
    
    g_motor_adc_channels[channel].offset = offset;
}

uint16_t motor_adc_get_raw_value(Motor_ADC_Channel_e channel)
{
    // 检查通道有效性
    if (channel >= MOTOR_ADC_CHANNEL_MAX || !g_motor_adc_channels[channel].is_valid) {
        return 0;
    }
    
    return g_motor_adc_channels[channel].adc_raw_value;
}

float motor_adc_get_converted_value(Motor_ADC_Channel_e channel)
{
    // 检查通道有效性
    if (channel >= MOTOR_ADC_CHANNEL_MAX || !g_motor_adc_channels[channel].is_valid) {
        return 0.0f;
    }
    
    return g_motor_adc_channels[channel].conv_value;
}

uint8_t motor_adc_is_valid(Motor_ADC_Channel_e channel)
{
    // 检查通道有效性
    if (channel >= MOTOR_ADC_CHANNEL_MAX) {
        return 0;
    }
    
    return g_motor_adc_channels[channel].is_valid;
}

// ADC数据更新回调函数（用于DMA传输完成中断）
void motor_adc_dma_update_callback(ADC_HandleTypeDef *hadc)
{
    if (hadc->State != HAL_ADC_STATE_READY) {
        return; // ADC未准备好，直接返回
    }
    
    // 遍历所有通道并更新数据
    for (int i = 0; i < MOTOR_ADC_CHANNEL_MAX; i++) {
        if (g_motor_adc_channels[i].is_valid && g_motor_adc_channels[i].adc_handle == hadc) {
            // 读取转换结果（DMA模式下直接从内存读取）
            // 注意：这里需要根据实际的DMA配置来获取数据
            // 假设使用多通道扫描模式，数据存储在ADC的DMA缓冲区中
            
            // 应用偏移量校准
            int32_t calibrated_value = (int32_t)g_motor_adc_channels[i].adc_raw_value - (int32_t)g_motor_adc_channels[i].offset;
            if (calibrated_value < 0) calibrated_value = 0;
            
            // 应用转换系数
            g_motor_adc_channels[i].conv_value = (float)calibrated_value * g_motor_adc_channels[i].conv_coef;
        }
    }
}

void motor_adc_update_all_channels_dma(void)
{
    // 如果使用DMA，假设数据已通过DMA传输完成
    // 直接从DMA缓冲区读取数据并应用转换
    for (int i = 0; i < MOTOR_ADC_CHANNEL_MAX; i++) {
        if (g_motor_adc_channels[i].is_valid && g_motor_adc_channels[i].adc_handle != NULL) {
            // 从DMA缓冲区获取数据（需要根据实际DMA配置调整）
            // g_motor_adc_channels[i].adc_raw_value = dma_buffer[i];
            
            // 应用偏移量校准和转换系数
            int32_t calibrated_value = (int32_t)g_motor_adc_channels[i].adc_raw_value - (int32_t)g_motor_adc_channels[i].offset;
            if (calibrated_value < 0) calibrated_value = 0;
            
            g_motor_adc_channels[i].conv_value = (float)calibrated_value * g_motor_adc_channels[i].conv_coef;
        }
    }
}